package com.demo.java.OD501_550.OD540;

import java.util.Scanner;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【中庸行者(C卷-100分)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146512638
 */
public class OdMain {
    public static int[][] matrix;
    public static int[][] visited;
    public static int m;
    public static int n;
    public static int result = 0;
    public static int[] directions = {-1, 0, 1, 0, -1};  // 用来表示上下左右的方向

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        m = in.nextInt();  // 输入行数
        n = in.nextInt();  // 输入列数
        matrix = new int[m][n];  // 初始化矩阵
        visited = new int[m][n];  // 初始化访问标记矩阵

        // 读取矩阵数据
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                matrix[i][j] = in.nextInt();
            }
        }

        // 对每个格子执行DFS搜索
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                dfs(i, j, 0, true);  // 从该点开始向上移动
                dfs(i, j, 0, false); // 从该点开始向下移动
            }
        }

        // 输出最大移动次数
        System.out.println(result);
    }

    // DFS函数，进行深度优先搜索
    public static void dfs(int x, int y, int step_count, boolean flag) {
        if (step_count > result) {
            result = step_count;  // 更新最大移动步数
        }

        visited[x][y] = 1;  // 标记当前格子为已访问
        int i = 1;

        // 尝试四个方向进行移动
        while (true) {
            if (i >= 5) {
                break;
            } else {
                int xx = x + directions[i - 1];  // 计算移动后的x坐标
                int yy = y + directions[i];      // 计算移动后的y坐标

                // 检查边界条件和是否已访问，是否符合数值递增的条件
                if (xx < 0 || yy < 0 || xx >= m || yy >= n || visited[xx][yy] == 1
                        || matrix[xx][yy] == matrix[x][y] || ((flag && matrix[xx][yy] > matrix[x][y])
                        || (!flag && matrix[xx][yy] < matrix[x][y]))) {
                    i += 1;
                    continue;
                }
                // 递归执行DFS，移动到新的格子
                dfs(xx, yy, step_count + 1, !flag);
            }
            i += 1;
        }

        visited[x][y] = 0;  // 递归结束后将该格子标记为未访问
    }
}